#ifndef STRAUSTRUPP_CH14_EX9
#define STRAUSTRUPP_CH14_EX9
namespace Graph_lib{

class Shape;
template<class T> class Vector_ref;
struct Circle;

/// @brief Группа объектов класса Shape, может присоединяться 
///	к окну так же, как простой объект Shape 
struct Group:public Shape{
	/**
	 * @brief добавить к группе неименованный объект Shape 
	 *
	 * @param s указатель на объект Shape
	 */
    void attach_shape(Shape* s);
	/**
	 * @brief добавить к группе именованный объект Shape 
	 *
	 * @param s ссылка на объект Shape
	 */
    void attach_shape(Shape& s);
	/**
	 * @brief перегруженная виртуальная функция из класса Shape, отвечающая за 
	 * прорисовку фигур, входящих в группу.
	 */
    void draw_lines() const;
	/**
	 * @return количество объектов в группе. 
	 */
    int size() const {return shapes.size();}
	/**
	 * @brief оператор доступа к i-му объекту группы 
	 */
    Shape& operator [] (int i) {return shapes[i];}
    const Shape& operator [] (int i) const {return shapes[i];}
private:
    Vector_ref<Shape> shapes;
};


/**
 * @brief Закрашенная окружность
 */
struct Filled_Circle:Circle{
    /**
     * @brief конструктор
     *
     * @param xy центр окружности
     * @param 
     * @param r радиус окружности
     */
	Filled_Circle (Point xy, int r):Circle(xy,r){}
    /**
	 * @brief перегруженная виртуальная функция из класса Shape, отвечающая за 
	 * прорисовку фигуры
     */
	void draw_lines() const;
};
}
#endif  //STRAUSTRUPP_CH14_EX9
